// 构建 npm
import http from 'wechat-http'

// 配置基础地址
http.baseURL = 'https://live-api.itheima.net'

// 配置拦截器(请求  响应)  等会

// 请求拦截器
http.intercept.request = (options) => {
  // 指定默认的头信息
  const defaultHeader = {}

  // 权限认证
  if (getApp().token) defaultHeader.Authorization = 'Bearer ' + getApp().token

  // 合并头信息
  // options.header = Object.assign({}, defaultHeader, options.header)
  options.header = {
    ...defaultHeader,
    ...options.header, // 便于添加额外的请求头信息
  }

  // 拦截器处理后的请求参数
  return options
}

// 响应拦截器
http.intercept.response = async (res) => {
  // res => 原本的数据
  console.log('原本的数据:', res, res.config)
  // const { data } = res
  // // 需求: 希望同意处理 请求成功但操作失败code的情况 => 提示 走失败的 promise
  // if (data.code === 10000) {
  //   return data // 返回值决定了浏览器接收到什么数据
  // } else {
  //   wx.toast() // 提示
  //   return Promise.reject(new Error(data.message)) // 失败的 promise  走.catch
  // }

  // 判断 statusCode 是 401 => 清除 token + 跳转去登录 + 提示
  if (res.statusCode === 401) {
    // 在这里写代码 我如果发现这次 401 是refreshToken引起的 就去登录页 顺带 return
    if (res.config.url.endsWith('/refreshToken')) {
      // console.log('你彻底没救了')
      const pages = getCurrentPages() // 获取页面栈
      const page = pages[pages.length - 1] // 获取当前页面
      const backUrl = page.route // 获取当前页面的路径(小细节 少个/)

      return wx.redirectTo({
        url: '/pages/login/index?backUrl=/' + backUrl,
      })
    }

    // const pages = getCurrentPages() // 获取页面栈
    // const page = pages[pages.length - 1] // 获取当前页面
    // const backUrl = page.route // 获取当前页面的路径(小细节 少个/)

    // getApp().removeToken()
    // wx.redirectTo({
    //   url: '/pages/login/index?backUrl=/' + backUrl,
    // })
    // wx.toast('请重新登录')

    // 利用refreshToken刷新 token => 请求后端接口获取一个新的 token
    const res2 = await http({
      method: 'post',
      url: '/refreshToken',
      header: {
        Authorization: 'Bearer ' + getApp().refreshToken,
      },
    })
    // console.log('刷新 token 响应的结果', res2) // res2.data.token  res2.data.refreshToken
    // 最新的 token 以及 refreshToken 存储下来
    getApp().setToken(res2.data.token)
    getApp().setRefreshToken(res2.data.refreshToken)

    // 用新的 token 发送之前 401 的请求
    return http({
      ...res.config, // 就是之前请求的配置对象
      header: {
        Authorization: 'Bearer ' + getApp().token,
      },
    })
  }

  return res.data
}

// 导出
export default http

/* 
  wx.request({
      url: '',
      method: '',
      data: {},
      header: {},
      success() {},
  })                     wechat-http

  new XHRHttpRequest()   axios
*/

/* 
  以往都是在 token 过期后  跳转登录重新登录
  => 这种用户体验很不好

  全新的方案用于处理 token 过期      在 token 过期后 代码自己就会去请求后端接口 获取一个新 token    =>  无感刷新 token
  => 直接避免了用户回到登录页 手动输入手机号 验证码   用户体验好

  享+项目为什么可以选择这个方案 是因为后端在登录完成后返回了一个用于获取新 token 的 refreshToken 字段
  refreshToken 的作用非常大 因为有了他 将来只要出现 401 你就可以用refreshToken去获取一个新的 token

  步骤: 
    1. 存refreshToken(像 token 一样管理 refreshToken 且在登录时手动存)
    2. 401 时  不再去登录  我自己用refreshToken去帮用户获取新 token  => 刷新 token

      2.1 未登录时 页面中的请求不用发  重置两个钩子
      2.2 真的出现 401 了  获取到新 token 了 要帮用户发送之前失败的请求
      2.3 如果 refreshToken 也失效了 没得酒了  直接去登录
*/
